package acme.bloodtime.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import modelo.IFamiliaDAO;
import modelo.IFamiliaDO;
import dao.api.DataObject;
import dao.api.FactoryDAO;

/**
 * 
 * @author Alejandra Alvarez I.
 * 
 */
public class FamiliaDAO extends BloodTimeBaseDAO implements IFamiliaDAO {

    public FamiliaDAO() {
        // Empty
    }

    @Override
    public void createTable() throws SQLException {
        StringBuffer strbuf;

        // ----------------------------------------

        dropTable();

        // ----------------------------------------

        strbuf = new StringBuffer();

        strbuf.append("CREATE TABLE ");
        strbuf.append(getTableName());
        strbuf.append(" (");
        strbuf.append(FamiliaDO.ID);
        strbuf.append(" SERIAL PRIMARY KEY,    ");
        strbuf.append(FamiliaDO.NOMBRE);
        strbuf.append(" VARCHAR(15) NOT NULL,    ");
        strbuf.append(FamiliaDO.DESCRIPCION);
        strbuf.append(" VARCHAR(500) NOT NULL,    ");
        strbuf.append(FamiliaDO.IMAGEN);
        strbuf.append(" BYTEA,    ");
        strbuf.append(FamiliaDO.VALOR_INICIAL_FUERZA);
        strbuf.append(" INT NOT NULL,    ");
        strbuf.append(FamiliaDO.VALOR_INICIAL_DEFENSA);
        strbuf.append(" INT NOT NULL,    ");
        strbuf.append(FamiliaDO.VALOR_INICIAL_SIGILOSIDAD);
        strbuf.append(" INT NOT NULL,    ");
        strbuf.append(FamiliaDO.VALOR_INICIAL_VELOCIDAD);
        strbuf.append(" INT NOT NULL,    ");
        strbuf.append(FamiliaDO.VALOR_INICIAL_HAB_NEGOCIOS);
        strbuf.append(" INT NOT NULL,    ");
        strbuf.append(FamiliaDO.VALOR_INICIAL_HAB_ARMAS);
        strbuf.append(" INT NOT NULL");
        strbuf.append(")");

        System.err.println(strbuf.toString());

        connection.createStatement().execute(strbuf.toString());
    }

    @Override
    public void delete(DataObject familiaDO) throws SQLException {
        internalDelete(familiaDO, FamiliaDO.class);
    }

    @Override
    public void insert(DataObject dataObject) throws SQLException {
        checkCache(dataObject, CHECK_INSERT);
        checkClass(dataObject, FamiliaDO.class, CHECK_INSERT);

        FamiliaDO familiaDO = (FamiliaDO) dataObject;

        familiaDO.setId(getNextId());

        StringBuffer strbuf = new StringBuffer();

        strbuf.append("INSERT INTO ");
        strbuf.append(getTableName());
        strbuf.append(" VALUES (");
        strbuf.append(familiaDO.getId());
        strbuf.append(", ");
        strbuf.append(singleQuotes(familiaDO.getNombre()));
        strbuf.append(", ");
        strbuf.append(singleQuotes(familiaDO.getDescripcion()));
        strbuf.append(", ");
        strbuf.append("?, ");
        strbuf.append(familiaDO.getValorInicialFuerza());
        strbuf.append(", ");
        strbuf.append(familiaDO.getValorInicialDefensa());
        strbuf.append(", ");
        strbuf.append(familiaDO.getValorInicialSigilosidad());
        strbuf.append(", ");
        strbuf.append(familiaDO.getValorInicialVelocidad());
        strbuf.append(", ");
        strbuf.append(familiaDO.getValorInicialHabNegocios());
        strbuf.append(", ");
        strbuf.append(familiaDO.getValorInicialHabArmas());
        strbuf.append(")");

        PreparedStatement ps = connection.prepareStatement(strbuf.toString());
        ps.setBytes(1, familiaDO.getImagen());

        ps.executeUpdate();
        ps.close();

        System.err.println(strbuf.toString());

        dtaSession.add(dataObject);
    }

    protected FamiliaDO resultSetToDO(ResultSet rs) throws SQLException {
        FamiliaDO ret = //
        (FamiliaDO) dtaSession.getDtaByKey( //
                FamiliaDO.class, rs.getInt(FamiliaDO.ID));

        if (ret != null) {
            return ret;
        }

        ret = new FamiliaDO();

        ret.setId/*                       */(rs.getInt(FamiliaDO.ID));
        ret.setNombre/*                   */(rs.getString(FamiliaDO.NOMBRE));
        ret.setDescripcion/*              */(rs.getString(FamiliaDO.DESCRIPCION));
        ret.setImagen/*                   */(rs.getBytes(FamiliaDO.IMAGEN));
        ret.setValorInicialFuerza/*       */(rs.getInt(FamiliaDO.VALOR_INICIAL_FUERZA));
        ret.setValorInicialDefensa/*      */(rs.getInt(FamiliaDO.VALOR_INICIAL_DEFENSA));
        ret.setValorInicialSigilosidad/*  */(rs.getInt(FamiliaDO.VALOR_INICIAL_SIGILOSIDAD));
        ret.setValorInicialVelocidad/*    */(rs.getInt(FamiliaDO.VALOR_INICIAL_VELOCIDAD));
        ret.setValorInicialHabNegocios/*  */(rs.getInt(FamiliaDO.VALOR_INICIAL_HAB_NEGOCIOS));
        ret.setValorInicialHabArmas/*     */(rs.getInt(FamiliaDO.VALOR_INICIAL_HAB_ARMAS));

        return (FamiliaDO) dtaSession.add(ret);
    }

    @Override
    public void update(DataObject dataObject) throws SQLException {
        checkCache(dataObject, CHECK_UPDATE);
        checkClass(dataObject, FamiliaDO.class, CHECK_UPDATE);

        FamiliaDO familiaDO = (FamiliaDO) dataObject;

        StringBuffer strbuf = new StringBuffer();

        strbuf.append("UPDATE ");
        strbuf.append(getTableName());
        strbuf.append(" SET ");

        strbuf.append(FamiliaDO.NOMBRE);
        strbuf.append(" = ");
        strbuf.append(singleQuotes(familiaDO.getNombre()));

        strbuf.append(", ");

        strbuf.append(FamiliaDO.DESCRIPCION);
        strbuf.append(" = ");
        strbuf.append(singleQuotes(familiaDO.getDescripcion()));

        strbuf.append(", ");

        strbuf.append(FamiliaDO.IMAGEN);
        strbuf.append(" = ");
        strbuf.append(" ? ");

        strbuf.append(", ");

        strbuf.append(FamiliaDO.VALOR_INICIAL_FUERZA);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getValorInicialFuerza());

        strbuf.append(", ");

        strbuf.append(FamiliaDO.VALOR_INICIAL_DEFENSA);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getValorInicialDefensa());

        strbuf.append(", ");

        strbuf.append(FamiliaDO.VALOR_INICIAL_SIGILOSIDAD);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getValorInicialSigilosidad());

        strbuf.append(", ");

        strbuf.append(FamiliaDO.VALOR_INICIAL_VELOCIDAD);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getValorInicialVelocidad());

        strbuf.append(", ");

        strbuf.append(FamiliaDO.VALOR_INICIAL_HAB_NEGOCIOS);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getValorInicialHabNegocios());

        strbuf.append(", ");

        strbuf.append(FamiliaDO.VALOR_INICIAL_HAB_ARMAS);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getValorInicialHabArmas());

        strbuf.append(" WHERE ");
        strbuf.append(FamiliaDO.ID);
        strbuf.append(" = ");
        strbuf.append(familiaDO.getId());

        PreparedStatement ps = connection.prepareStatement(strbuf.toString());
        ps.setBytes(1, familiaDO.getImagen());

        ps.executeUpdate();
        ps.close();

        System.err.println(strbuf.toString());

    }

    public void loadVampiroList(IFamiliaDO familiaDO) throws Exception {
        checkCache(familiaDO, CHECK_UPDATE);
        checkClass(familiaDO, FamiliaDO.class, CHECK_UPDATE);

        VampiroDAO vampiroDAO = (VampiroDAO) FactoryDAO.getDAO( //
                VampiroDAO.class, connectionBean);

        familiaDO.setVampiroList(vampiroDAO.listByFamiliaId(familiaDO.getId()));
    }

    @Override
    public byte[] loadImageByFamiliaId(int familiaId) throws SQLException {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT ");
        strbuf.append(FamiliaDO.IMAGEN);
        strbuf.append(" FROM ");
        strbuf.append(getTableName());
        strbuf.append(" WHERE ");
        strbuf.append(FamiliaDO.ID);
        strbuf.append(" = ");
        strbuf.append(familiaId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        if (rs.next()) {
            return rs.getBytes(FamiliaDO.IMAGEN);
        }

        return null;
    }

}
